/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gestionnairebeans;

import entities.CompteBancaire;  
import entities.CompteBancaireEpargne;
import entities.CompteBancaireJoint;
import entities.OperationBancaire;
import entities.Utilisateur;
import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
import session.GestionnaireDeCompteBancaire;
import session.GestionnaireUtilisateur;

/**
 *
 * @author Lionel Prado
 */

@ManagedBean
@ViewScoped
@Named(value = "compteBancaireBean")
@SessionScoped
public class CompteBancaireBean implements Serializable {
    @EJB
    private GestionnaireDeCompteBancaire gestionnaireDeCompteBancaire;
    @EJB
    private GestionnaireUtilisateur gestionnaireUtilisateur;
        
    private CompteBancaire compteBancaire;
    private CompteBancaire compteBancaire2  = new CompteBancaire();
    
    private CompteBancaire details = new CompteBancaire();
    private CompteBancaireEpargne cbe = new CompteBancaireEpargne();
    private CompteBancaireJoint cbj = new CompteBancaireJoint();
    
    private Collection<CompteBancaire> listeCB;
    private Collection<CompteBancaire> listeCBUser;
    private Collection<CompteBancaire> listCBDiffCbCourant;
    
    //variables pour le transfert
    private float soldeTransfert;
    private Long id1;
    private Long id2;

    private Utilisateur utilisateur = new Utilisateur();
    private Utilisateur utilisateur2 = new Utilisateur();
    
    private Collection<Utilisateur> listeUser;
    private Collection<Utilisateur> listeUserDiffUserCourant;
       
    private String login;
    private String password;
    private boolean typeUser;
    // fixé à true pour etre connecté directe pour la phase de dev
    private boolean connectedUser = false;
    private boolean connectedAdmin = false;
    private String message = "Veuillez vous identifier :";
    
    
    //////////////////////////////////////////////////////////////////////LOGINBEAN//////////////////////////////
    
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public boolean isConnectedUser() {
        return connectedUser;
    }

    public void setConnectedUser(boolean connectedUser) {
        this.connectedUser = connectedUser;
    }
    
    public boolean isConnectedAdmin() {
        return connectedAdmin;
    }

    public void setConnectedAdmin(boolean connectedAdmin) {
        this.connectedAdmin = connectedAdmin;
    }

    public Utilisateur getUtilisateur() {
        return utilisateur;
    }

    public void setUtilisateur(Utilisateur utilisateur) {
        this.utilisateur = utilisateur;
    }
    
    public void setIdUser(Long idUser) {
        System.out.println("setter user !!!");
        this.utilisateur = gestionnaireUtilisateur.getUtilisateur(idUser);
        System.out.println("user ACTUEL : " + this.utilisateur.getLogin());
    }
    
    public Long getIdUser() {
        System.out.println("getter user !!!_________là_____________" + utilisateur.getId());
        return utilisateur.getId();
    }

    public String deconnexion() {
        connectedAdmin = false;
        connectedUser = false;
        message = "Veuillez vous identifier :";
        return "index?faces-redirect=true&amp;includeViewParams=true";
    }

    public String checkLogin() {

        boolean sortir = false;
        String redirection = "index?faces-redirect=true&amp;includeViewParams=true";
        message = "Mauvais login/password, veuillez recommencer !";

        Collection<Utilisateur> liste = gestionnaireUtilisateur.getAllUtilisateurs();
        
        if(liste.isEmpty()){
            gestionnaireDeCompteBancaire.creerComptesTest();
            liste = gestionnaireUtilisateur.getAllUtilisateurs();
        }

        Iterator iterator = liste.iterator();

        while (iterator.hasNext() && !sortir) {

            utilisateur = (Utilisateur) iterator.next();

            System.out.print("login : " + utilisateur.getLogin() + "pass : " + utilisateur.getPassword());
            
            if( login.equals(utilisateur.getLogin()) && password.equals(utilisateur.getPassword()) ){
                if (utilisateur.getTypeUser() == false){
                    connectedUser = (login.equals(utilisateur.getLogin()) && password.equals(utilisateur.getPassword()));
                    System.out.print("------user-----------" + connectedUser);
                    message = "Connecté en tant que utilisateur : " + utilisateur.getPrenomProprietaire() + " " + utilisateur.getNomProprietaire() + "   ";
                    redirection = "CompteBancaireListUser?faces-redirect=true&amp;includeViewParams=true";
                    sortir = true;
                } 
                if (utilisateur.getTypeUser() == true) {
                    connectedAdmin = (login.equals(utilisateur.getLogin()) && password.equals(utilisateur.getPassword()));
                    System.out.print("--------admin---------" + connectedAdmin);
                    message = "Connecté en tant que administrateur : " + utilisateur.getPrenomProprietaire() + " " + utilisateur.getNomProprietaire() + "   ";
                    redirection = "UtilisateurList?faces-redirect=true&amp;includeViewParams=true";
                    sortir = true;
                }
            }

            System.out.print("sortir : " + sortir);
            
        }




        System.out.print("retour :" + redirection);
        return redirection;

    }
    
    
    //////////////////////////////////////////////////////////////////////HANDLER//////////////////////////////
    
    public CompteBancaire getCompteBancaire2() {
        return compteBancaire2;
    }

    public CompteBancaire getCompteBancaire() {
        return compteBancaire;
    }

    public void setCbe(CompteBancaireEpargne cbe) {
        this.cbe = cbe;
    }

    public void setCbj(CompteBancaireJoint cbj) {
        this.cbj = cbj;
    }

    public CompteBancaireEpargne getCbe() {
        return cbe;
    }

    public CompteBancaireJoint getCbj() {
        return cbj;
    }
        
    public void setCompteBancaire2(CompteBancaire compteBancaire2) {
        this.compteBancaire2 = compteBancaire2;
    }

    public float getSoldeTransfert() {
        return soldeTransfert;
    }

    public void setSoldeTransfert(float soldeTransfert) {
        this.soldeTransfert = soldeTransfert;
    }

    public Long getId1() {
        return id1;
    }

    public void setId1(Long id1) {
        this.id1 = id1;
    }

    public Long getId2() {
        return id2;
    }

    public void setId2(Long id2) {
        this.id2 = id2;
    }
    
    
    public Long getIdCompte() {
        return (compteBancaire==null)?0:compteBancaire.getId();
    }
    public void setIdCompte(Long id) {
        System.out.println("setter compte !!!");
        this.compteBancaire = gestionnaireDeCompteBancaire.getCompte(id);
    }
    
    public Collection<OperationBancaire> getListeOperationsCB() {
        return compteBancaire.getOperations();
    }
    
    public String chargerOperations(CompteBancaire cb)
    {
        this.compteBancaire = cb;
        return "OperationDetails?faces-redirect=true&amp;includeViewParams=true";
    }
    
    public String chargerUpdate(CompteBancaire cb)
    {
        this.compteBancaire = cb;
        return "UpdateCompteBancaire?faces-redirect=true&amp;includeViewParams=true";
    }
    
    public String chargerUpdateUser(Utilisateur u)
    {
        this.utilisateur = u;
        return "UpdateUtilisateur?faces-redirect=true&amp;includeViewParams=true";
    }
    
    public String chargerTransfererCompteBancaire(CompteBancaire cb){
        this.compteBancaire = cb;
        return "TransfertCompteBancaire?faces-redirect=true&amp;includeViewParams=true";
    }
    
    public String chargerTransfererCompteBancaireUser(CompteBancaire cb){
        this.compteBancaire = cb;
        return "TransfertCompteBancaireUser?faces-redirect=true&amp;includeViewParams=true";
    }
        
    //transferer une somme d'un compte à l'autre
    public String transfererCompteBancaire(){
        
      
        System.out.println("###TRANSFERT !!! ###");  
        System.out.println("id 1 : " + compteBancaire.getId() + " ||  id 2 : " + id2);
            
        System.out.println("id 1 : " + compteBancaire.getId() + "id 2 : ");
        
        compteBancaire = gestionnaireDeCompteBancaire.getCompte(compteBancaire.getId());
        compteBancaire2 = gestionnaireDeCompteBancaire.getCompte(compteBancaire2.getId());
        
        compteBancaire.soustraireSolde(soldeTransfert);
        compteBancaire2.ajouterSolde(soldeTransfert);
        
        OperationBancaire op1 = new OperationBancaire("Debit du compte " + compteBancaire.getId() + " vers le " + compteBancaire2.getId(), -soldeTransfert);  
        compteBancaire.getOperations().add(op1); // ici on ajoute la relation  
        
        OperationBancaire op2 = new OperationBancaire("Credit du compte " + compteBancaire2.getId() + " vers le " + compteBancaire.getId(), +soldeTransfert);  
        compteBancaire2.getOperations().add(op2); // ici on ajoute la relation  

        gestionnaireDeCompteBancaire.update(compteBancaire); 

        gestionnaireDeCompteBancaire.update(compteBancaire2); 
        
        if(connectedUser)
            return "CompteBancaireListUser?faces-redirect=true&amp;includeViewParams=true";
        else    
            return "ComptesBancairesUtilisateurDetails?faces-redirect=true&amp;includeViewParams=true";
    }
    
    public Collection<CompteBancaire> getListCB() {
        listeCB = gestionnaireDeCompteBancaire.getAllComptes();
        return listeCB;
    }
    
    public Collection<CompteBancaire> getListCBUser() {
        listeCBUser = gestionnaireDeCompteBancaire.getAllComptesCbUser(getIdCompte(), utilisateur);
        return listeCBUser;
    }
    
    public void setListCBUser(List<CompteBancaire> listeCBUser) {
        this.listeCBUser = listeCBUser;
    }

    
    public Collection<CompteBancaire> getListCBDiffCbCourant() {
        listCBDiffCbCourant = gestionnaireDeCompteBancaire.getAllComptesDiffCbCourant(utilisateur);
        return listCBDiffCbCourant;
    }
    
    public void setListCBDiffCbCourant(List<CompteBancaire> listCBDiffCbCourant) {
        this.listCBDiffCbCourant = listCBDiffCbCourant;
    }

    public void setListCB(List<CompteBancaire> listCB) {
        this.listeCB = listCB;
    }


    
    /**
     * Creates a new instance of CompteBancaireBean
     */
    public CompteBancaireBean() {
    }
    
    
    //Permet d'afficher un seule compte bancaire
    public String afficherComptesBancaires(){
    
        System.out.print("comptes affichés !!!");
        
        return "CompteBancaireList?faces-redirect=true&amp;includeViewParams=true";
    }
    
    //Permet de charger le module créer compte bancaire
    public String chargerCreerCompteBancaire(){
        System.out.print("module création compte");
        
        return "CreationCompteBancaire?faces-redirect=true&amp;includeViewParams=true";
    }
    
    //Permet de charger le module créer compte bancaire
    public String chargerCreerCompteBancaireEpargne(){
        System.out.print("module création compte epargne");
        
        return "CreationCompteBancaireEpargne?faces-redirect=true&amp;includeViewParams=true";
    }
    
    //Permet de charger le module créer compte bancaire
    public String chargerCreerCompteBancaireJoint(){
        System.out.print("module création compte joint");
        
        return "CreationCompteBancaireJoint?faces-redirect=true&amp;includeViewParams=true";
    }
    
 
    //Permet de charger le module de transfert de compte bancaire
    public String chargerEffectuerUnTransfertDeCompteBancaire(){
        System.out.print("module transfert de compte");
        
        return "TransfertCompteBancaire?faces-redirect=true&amp;includeViewParams=true";
    }
    
    //Permet de créer un seule compte bancaire
    public String creerCompteBancaire(){

        gestionnaireDeCompteBancaire.creerCompteBancaireCourant(this.utilisateur, this.details.getSoldeCompte()); 

        System.out.print("compte courant créé !!!");
        
        return "ComptesBancairesUtilisateurDetails?faces-redirect=true&amp;includeViewParams=true";
    }
    
        //Permet de créer un seule compte bancaire
    public String creerCompteBancaireEpargne(){
 
        System.out.print("//////////////////COMPTE EPARGNE DATA//////////////////////////////////////");
        
        System.out.print(this.cbe.getProprietaireCompte().getLogin());
        System.out.print(this.cbe.getSoldeCompte());
        System.out.print(this.cbe.getTaux());
                
        System.out.print("////////////////////////////////////////////////////////");
        
        gestionnaireDeCompteBancaire.creerCompteBancaireEpargne(this.cbe.getProprietaireCompte(), this.cbe.getSoldeCompte(), this.cbe.getTaux());  
        System.out.print("compte epargne créé !!!");
        
//        return "ComptesBancairesUtilisateurDetails?faces-redirect=true&amp;includeViewParams=true";
        return "ComptesBancairesUtilisateurDetails?faces-redirect=true&amp;includeViewParams=true";
    }
    
    public String creerCompteBancaireJoint(){
 
        System.out.print("compte joint créé !!!------------------------------");
        System.out.print("////////////////////////////////////////////////////////");
        
        System.out.print(this.utilisateur.getLogin());
        System.out.print(this.cbj.getSoldeCompte());
        System.out.print(this.utilisateur2.getId());
//        
        this.utilisateur2 = gestionnaireUtilisateur.getUtilisateur(this.utilisateur2.getId());
//        
        System.out.print("////////////////////////////////////////////////////////");
        
         System.out.print("////////////////////////////////////////////////////////");
        
        System.out.print(this.utilisateur.getLogin());
        System.out.print(this.cbj.getSoldeCompte());
        System.out.print(this.utilisateur2.getLogin());
                
        System.out.print("////////////////////////////////////////////////////////");
            
        gestionnaireDeCompteBancaire.creerCompteJoint(this.utilisateur, this.cbj.getSoldeCompte(), this.utilisateur2);

        return "ComptesBancairesUtilisateurDetails?faces-redirect=true&amp;includeViewParams=true";
    }
        
    //Permet de créer un jeux de données de comptes banquaires
    public String creerComptesBancaires(){
        gestionnaireDeCompteBancaire.creerComptesTest();

        return "UtilisateurList?faces-redirect=true&amp;includeViewParams=true";
    }

    /** 
     * Renvoie les détails du CompteBancaire courant (celui dans l'attribut CompteBancaire de 
     * cette classe), qu'on appelle une propriété (property) 
     * @return 
     */  
    public CompteBancaire getDetails() {  
        return details;  
    }  
    
    public void setDetails(CompteBancaire cb)
    {
        this.details = cb;
    }
  
    public String update() {  
       System.out.println("###UPDATE###");  

       this.details.setId(compteBancaire.getId());
       
       System.out.println("CEST CA         ddddd " + this.details.getProprietaireCompte().getNomProprietaire());
               
       compteBancaire = gestionnaireDeCompteBancaire.getCompte(compteBancaire.getId());
       if((compteBancaire.getProprietaireCompte().getNomProprietaire() != this.details.getProprietaireCompte().getNomProprietaire()) && !this.details.getProprietaireCompte().getNomProprietaire().isEmpty() )
           compteBancaire.setProprietaireCompte(this.details.getProprietaireCompte());
           
       if((compteBancaire.getSoldeCompte() != this.details.getSoldeCompte()) && this.details.getSoldeCompte() != 0)
           compteBancaire.setSoldeCompte(this.details.getSoldeCompte());
       
       gestionnaireDeCompteBancaire.update(compteBancaire);  
               
        return "CompteBancaireList?faces-redirect=true&amp;includeViewParams=true";
    }  
    
    //Suppression admin
    public String supprimerCompteBancaireAdmin(CompteBancaire cb){

        System.out.println("###DELETE Admin###"); 
        this.compteBancaire = cb;
        gestionnaireDeCompteBancaire.delete(this.compteBancaire);     
        return "ComptesBancairesUtilisateurDetails?faces-redirect=true&amp;includeViewParams=true";
    }
  
    /** 
     * Action handler - renvoie vers la page qui affiche la liste des clients 
     * @return 
     */  
    public String list() {  
        System.out.println("###LIST###");  
        return "OperationDetails";  
    }  
            
    public Collection<Utilisateur> getListeUser() {
        listeUser = gestionnaireUtilisateur.getAllUtilisateurs();
        return listeUser;
    }

    public void setListeUser(List<Utilisateur> listeUser) {
        this.listeUser = listeUser;
    }

    public Collection<Utilisateur> getListeUserDiffUserCourant() {
        listeUserDiffUserCourant = gestionnaireUtilisateur.getAllUtilisateursSaufUserCourant(utilisateur);
        return listeUserDiffUserCourant;
    }

    public void setListeUserDiffUserCourant(List<Utilisateur> listeUserDiffUserCourant) {
        this.listeUserDiffUserCourant = listeUserDiffUserCourant;
    }
    
            
    public Utilisateur getUtilisateur2() {
        return utilisateur2;
    }

    public void setUtilisateur2(Utilisateur utilisateur2) {
        this.utilisateur2 = utilisateur2;
    }

    //Permet de charger le module créer compte bancaire
    public String chargerCreerUnUtilisateur(){
        System.out.print("module création d'utilisateur");
        return "CreationUtilisateur?faces-redirect=true&amp;includeViewParams=true";
    }
    
    //Permet de créer un seule user
    public String creerUnUtilisateur(){
        
        
        gestionnaireUtilisateur.creerUtilisateur(this.utilisateur.getLogin(), this.utilisateur.getPassword(), this.utilisateur.getPrenomProprietaire(), this.utilisateur.getNomProprietaire(), true);  
        
        System.out.print("utilisateur créé !!!");
        
        return "UtilisateurList?faces-redirect=true&amp;includeViewParams=true";
    }
    
    //Permet de créer un seule user
    public String modifierUnUtilisateur(){
        
        utilisateur2 = gestionnaireUtilisateur.getUtilisateur(this.utilisateur.getId());
        utilisateur2.setLogin(this.utilisateur.getLogin());
        utilisateur2.setPassword(this.utilisateur.getPassword());
        utilisateur2.setPrenomProprietaire(this.utilisateur.getPrenomProprietaire());
        utilisateur2.setNomProprietaire(this.utilisateur.getNomProprietaire());
        
        utilisateur = utilisateur2;
        
        gestionnaireUtilisateur.update(utilisateur);  
        
        System.out.print("utilisateur modifié !!!");
        
        return "UtilisateurList?faces-redirect=true&amp;includeViewParams=true";
    }
    
    public String chargerComptesBancaires(Utilisateur u)
    {
        
        System.out.print("on yest!!!!!!!!!!!!!");
        
        this.utilisateur = u;
        return "ComptesBancairesUtilisateurDetails?faces-redirect=true&amp;includeViewParams=true";
    }
    
     public Collection<CompteBancaire> getListeCompteBancairesUser(){
        listeCBUser = gestionnaireDeCompteBancaire.getAllComptesByUser(utilisateur); 
        utilisateur.setListeCompteBancaire(listeCBUser);
        return utilisateur.getListeCompteBancaire();
    }

    //Permet de créer un seule compte bancaire
    public String afficherComptesBancairesUser(){
        return "CompteBancaireListUser?faces-redirect=true&amp;includeViewParams=true";
    }

    public String afficherLesUtilisateurs(){
        return "UtilisateurList?faces-redirect=true&amp;includeViewParams=true";
    }

    //Suppression
    public String supprimerUtilisateur(Utilisateur u){

        System.out.println("###DELETE###"); 
        this.utilisateur = u;
        gestionnaireUtilisateur.delete(this.utilisateur);   
        listeUser = gestionnaireUtilisateur.getAllUtilisateurs();  
        
        return "UtilisateurList?faces-redirect=true&amp;includeViewParams=true";
    }  
    
}
